# CMake 项目的基础配置
# 创建静态库或者共享库，可以选择 comment 出静态库行来生成不同的库类型。
# 如果你想要创建静态库，请取消下面一行的注释：
# add_library(game STATIC "game.cpp")  # 生成 game.lib

if(DEFINED ENV{GAME_STREAMING} AND "$ENV{GAME_STREAMING}" STREQUAL "1")
  message(STATUS "GAME_STREAMING=1, Game streaming is enabled.")
  add_definitions(-DENABLE_GAME_STREAMING=0)
else()
  message(STATUS "GAME_STREAMING is not set to 1. Skipping game streaming configuration.")
endif()

# 创建临时文件
file(WRITE ${CMAKE_BINARY_DIR}/game/lock.tmp "Temporary File Content/n")

# 创建共享库（DLL）
add_library(game SHARED "game.cpp" "game_asset.cpp" "game_debug.cpp" "game_audio.cpp" "game_cutscene.cpp" "game_world_mode.cpp" "game_render_group.cpp" "game_world.cpp" "game_sim_region.cpp" "game_entity.cpp" "game_opengl.cpp" "game_render.cpp" "game_debug_ui.cpp" "game_sort.cpp" "game_brain.cpp") # 生成 game.dll

# 设置目标属性，手动添加 EXPORT 标志
set_target_properties(game PROPERTIES
  LINK_FLAGS "/EXPORT:GameUpdateAndRender /EXPORT:GameGetSoundSamples  /EXPORT:DEBUGGameFrameEnd" # 设置导出函数的符号
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")

# 创建 win32_game 可执行文件，指定源文件
add_executable(win32_game WIN32 "win32_game.cpp" "game_opengl.cpp" "game_render.cpp" "game_sort.cpp")

# test_asset_builder
add_executable(test_asset_builder "test_asset_builder.cpp")

add_executable(simple_preprocess "simple_preprocessor.cpp")

add_definitions(-DUSE_FONTS_FROM_WINDOWS)

# 为编译器添加定义的全局宏
add_compile_definitions(GAME_SLOW=1 GAME_INTERNAL=1 COMPILE_MSVC=1 GAME_PROFILE=1 GAME_SLOW=1)

if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$")
  message(STATUS "Building for 64-bit (x64)")
  add_compile_definitions(__x86_64__)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i[3-6]86|x86)$")
  message(STATUS "Building for 32-bit (x86)")
  add_compile_definitions(__i386__)
else()
  message(STATUS "Unknown architecture: ${CMAKE_SYSTEM_PROCESSOR}")
endif()

# 获取当前时间，格式化为 年月日_时分秒
string(TIMESTAMP CURRENT_DATE "%Y%m%d_%H%M%S")

# message("Current date and time: ${CURRENT_DATE}")

# 使用 file(GLOB ...) 查找所有game_*.pdb文件，并逐个删除
file(GLOB PDB_FILES "${CMAKE_BINARY_DIR}/game/game_*.pdb")

add_custom_target(
  clean-lock
  COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/game/lock.tmp
  COMMENT "Removing temporary file after CMake configuration"
)

# 创建清理所有 .pdb 文件的自定义目标 clean-all
add_custom_target(clean-all
  COMMAND ${CMAKE_COMMAND} -E echo "Cleaning up game.pdb files"
  COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/CMakeLists.txt
  COMMENT "Updating game/CMakeLists.txt timestamp" # 跟新CMakeLists.txt时间戳
)

# 为 game 目标设置 PDB 文件路径，包含当前时间戳
# 这会生成动态链接库的 PDB 文件，文件名包括编译时的时间戳
if(MSVC) # 如果使用 Microsoft Visual C++ 编译器
  target_link_options(game PRIVATE "/PDB:${CMAKE_BINARY_DIR}/game/game_${CURRENT_DATE}.pdb")
  add_compile_options(CMAKE_CXX_FLAGS,"")
endif()

# 遍历所有 .pdb 文件，并为每个文件添加删除命令
foreach(PDB_FILE ${PDB_FILES})
  add_custom_command(
    TARGET clean-all
    POST_BUILD # 在构建之后执行
    COMMAND ${CMAKE_COMMAND} -E remove ${PDB_FILE} # 删除每个 .pdb 文件
    COMMENT "removing ${PDB_FILE}" # 注释，说明正在删除的文件

    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/game_test_asset/data/intro_art/intro_art.hha ${CMAKE_BINARY_DIR}/game/intro_art.hha
  )
endforeach()

# 确保在构建 'game' 之前先执行 clean-all 清理操作
add_dependencies(game clean-all)
add_dependencies(win32_game clean-lock game)

# 链接 Win32 库到 win32_game
# 这里链接了三个 Windows 库：User32.lib、Gdi32.lib 和 Winmm.lib
target_link_libraries(win32_game PRIVATE User32.lib Gdi32.lib Winmm.lib opengl32.lib)
target_link_libraries(game PRIVATE opengl32.lib)

# 如果使用 MSVC 编译器，添加编译选项
if(MSVC) # 如果编译器是 MSVC（Microsoft Visual C++）
  # 设置 C++ 编译选项：
  # /WX      : 将所有警告视为错误（会让编译因警告失败）
  # /W4      : 设置警告级别为 4，显示大多数警告
  # /wd4819  : 屏蔽警告 C4819，避免文件编码问题导致的警告
  # /wd4201  : 屏蔽警告 C4201，避免由于结构体定义引起的警告
  # /wd4505  : 屏蔽警告 C4505，避免由于不使用的函数引起的警告
  # /Zi      : 生成调试信息
  # /FC      : 显示完整的文件名和行号
  # /Zc:nrvo- 选项的作用是 禁用命名返回值优化（NRVO）。
  # /d1reportAllClassLayout 打印结构体布局信息
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  /WX  /W4 /arch:AVX2 /O2 /Zc:nrvo-   /wd4819 /wd4201 /wd4505 /wd4731 /Zi /FC")

  # 设置目标属性，手动关闭增量链接功能（incremental linking），以确保导出函数的符号
  set_target_properties(win32_game PROPERTIES
    LINK_FLAGS "-incremental:no" # 禁用增量链接
  )
endif()

# 确保使用 C++20 标准（仅在 CMake 版本大于 3.12 时才有效）
if(CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET win32_game PROPERTY CXX_STANDARD 20)
  set_property(TARGET game PROPERTY CXX_STANDARD 20)
endif()

# set_target_properties(game PROPERTIES
# LINK_FLAGS "/NODEFAULTLIB"
# )
# set_target_properties(win32_game PROPERTIES
# LINK_FLAGS "/NODEFAULTLIB"
# )